package com.example.demo.util;


import org.springframework.util.ClassUtils;

import javax.validation.constraints.NotNull;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author x c
 * @Email 378661553@qq.com
 * @Date Created in 2020/1/20 17:31
 */
public class ClassUtil extends ClassUtils {

    /**
     * 判断 #sub 是否是 #sup 的子类
     * @param sub 子类
     * @param sup 父类
     * @return 如果 sub 是 sup 的子类那么久返回 true ，否则返回 false
     */
    public static boolean isType(@NotNull Class<?> sub, @NotNull Class<?> sup){
        return sup.isAssignableFrom(sub);
    }

    /**
     * 无视final修饰，强行进行修改字段值
     */
    public static void setValue(@NotNull Object obj, @NotNull String fieldName, Object value) throws NoSuchFieldException, IllegalAccessException {
        Field field = obj.getClass().getDeclaredField(fieldName);
        Class<?> type = field.getType();
        if (Modifier.isFinal(field.getModifiers())) {
            field.setAccessible(true);
        }
        field.set(obj, value);
    }


    /**
     * 获取所有字段，以及字段对应的值
     * @param obj
     * @return 返回的是该 obj 对象的字段以及字段对呀的值，key:field value:fieldValue
     * @throws IllegalAccessException
     */
    public static Map<String, Object> findAllFieldValue(@NotNull Object obj) throws IllegalAccessException {
        Field[] allField = obj.getClass().getDeclaredFields();
        HashMap<String, Object> ret = new HashMap<>();
        if (allField.length == 0) {
            return ret;
        }
        for (Field field : allField) {
            ret.put(field.getName(), field.get(obj));
        }
        return ret;
    }

    /**
     * 获取该类的字段
     * @param cla
     * @return 该类型的所有字段，不包含父类的字段
     */
    public static Field[] findAllFields(@NotNull Class<?> cla) {
        return cla.getDeclaredFields();
    }
}
